18063
18304
Jeg har en liste over tider i sekunder som:
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
For hvert vindu med lengde på 2 sekunder som starter ved en annen grense, vil jeg sende en liste over alle tidene som faller innenfor det 2 sekunders vinduet. Så for eksemplet ovenfor vil det være:
[0.10218048, 1.20851996, 1.46800021, 1.73429061]
[1.20851996, 1.46800021, 1.73429061, 2.71525848]
[2.71525848, 3.14781922, 3.63637958]
[3.14781922, 3.63637958]
[5.11147358, 5.97497864]
[5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917]
[6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352]
[7.65215123, 7.86108352, 8.52988247, 8.83068894]
[8.52988247, 8.83068894]
[10.07690977]
[10.07690977, 11.5386728]
[11.5386728, 12.01214112, 12.13307653]
[12.01214112, 12.13307653]
Generelt kan vinduslengden være forskjellig fra 2.
Hvordan kan du gjøre dette? 
Jeg tror du mente økning basert på "For hvert vindu med lengde 2 sekunder som starter ved en annen grense" og ikke overlapper hverandre. I to sekunders intervaller er det det samme, men siden du vil variere lengden, vil en overlapping på ett sekund være 0-3, 2-5, 4-7, men inkrement vil bety 0-3, 1-4, 2- 5. Det var imidlertid interessant å finne ut løsninger for begge i tilfelle.
Forutsatt at L er sortert og alle elementene er positive og at de andre intervallene starter med heltall, kan vi bruke denne metoden:
importer matematikk
fra samlinger importerer standarddikt
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
my_ranges = defaultdict (liste)
intervallbredde = 2
for x i L:
upper_bound = math.ceil (x)
nedre_bundet = øvre_bundet - intervallbredde
lavere_bundet = maks (0, lavere_bundet)
for y innen rekkevidde (nedre, øvre)
my_ranges [y] .append (x)
for en i sortert (mine_ranger):
skriv ut (my_ranges [a])
Jeg vet ikke om du vil se om det er noen tomme områder. Men standarddikten skriver ut tomme områder hvis du også vil. Bruk denne linjen i stedet for "for a in sorted":
for en innen rekkevidde (min (mine_ranger), maks (mine_ranger) + 1):
Hvis du vil ha områdene 0-3, 2-5, 4-7, fungerer dette:
importer matematikk
fra samlinger importerer standarddikt
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
intervallbredde = 2
my_ranges_2 = defaultdict (liste)
for x i L:
definitivt_in = (x // (intervallbredde - 1)) * (intervallbredde - 1) # laveste multiplum av intervallbredde under x vil alltid være i
#print ("Legger til", x, "til", definitivt_in)
my_ranges_2 [definitely_in] .append (x)
hvis x  = 0: # for eksempel, hvis x er 2.3 og vi har 0,3 2,5 osv. ... må vi fange dette duplikattilfellet. Jeg antar at vinduslengdene er heltall, og hvis ikke, har vi mye mer å gjøre, fordi tallet kan gå i mer enn ett utvalg. Kanskje vi kunne ha en stundsløyfe, økende med (intervall_bredde - 1)
#print ("++ Legger til", x, "til", definitivt_in - intervallbredde + 1)
my_ranges_2 [definitely_in - interval_width + 1] .append (x)
for en i sortert (my_ranges_2):
skriv ut (a, my_ranges_2 [a])
# utskrift (my_ranges_2 [a])
Jeg mistenker at det er noen detaljer jeg har glemt, men forhåpentligvis kan du vri intervallbredde etter behov for å sørge for at koden min gjør det du håpet, og gi meg beskjed om hva du trenger.
|
En mulig løsning som jeg kan foreslå er "effektiv" på en måte, at den bare gjentas en gang gjennom inngangsdataene og ikke har noen avhengighet. Kostnaden er selvfølgelig at den er skrevet i ren python (det kan være mer optimalisert kode) og at den introduserer flere sporingsvariabler for å forhindre gjentakelse (og dermed er mindre pythonisk).
def sliding_window (data, varighet, start = 0, overlapping = 1):
resultat = []
data_idx = 0
resultat_idx = 0
øvre = start + varighet
lavere = start
next_lower = øvre - overlapping
# indre hjelper til å putte tomme indre lister opp til innsettingspunktet og innsatsen
def pad_and_append (at):
mens len (resultat) <= kl:
resultat.append ([])
resultat [at] .append (data [data_idx])
# iterere gjennom inndata
mens data_idx  a:
hvis x  = l [0]) & (L  = i) & (L